﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace 深入浅出WPF_BookDemo.Views
{
    /// <summary>
    /// Chapter08_2Window.xaml 的交互逻辑
    /// </summary>
    public partial class Chapter08_2Window : Window
    {
        public Chapter08_2Window()
        {
            InitializeComponent();
            this.AddHandler(Button.ClickEvent, new RoutedEventHandler(this.Button_Click02));
            this.AddHandler(Student.NameChangedEvent, new RoutedEventHandler(this.StudentNameChangedHandler));
        }

        private void StudentNameChangedHandler(object sender, RoutedEventArgs e)
        {
            MessageBox.Show((e.OriginalSource as Student).Id.ToString());
        }

        private void Button_Click02(object sender, RoutedEventArgs e)
        {
            string strOriginSource = string.Format("VisualTree start point: {0},type is {1}",
                (e.OriginalSource as FrameworkElement).Name, e.OriginalSource.GetType().Name);

            string strSource = string.Format("LogicalTree start point: {0},type is {1}",
                (e.Source as FrameworkElement).Name, e.Source.GetType().Name);

            MessageBox.Show(strOriginSource + "\r\n" + strSource);
        }

        private void ReportTimeHandler(object sender, ReportTimeEventArgs e)
        {
            FrameworkElement element = sender as FrameworkElement;
            string timeStr = e.ClickTime.ToLongTimeString();
            string content = string.Format("{0} 到达 {1}", timeStr, element.Name);
            this.listBox.Items.Add(content);

            if (element == this.grid_2)
            {
                //已经触发过
                e.Handled = true;
            }

        }

        private void button03_Click(object sender, RoutedEventArgs e)
        {
            Student student = new Student() { Id = 101, Name = "Tim" };
            student.Name = "Tom";
            RoutedEventArgs arg = new RoutedEventArgs(Student.NameChangedEvent, student);
            this.button03.RaiseEvent(arg);
        }
    }

    public class ReportTimeEventArgs : RoutedEventArgs
    {
        public ReportTimeEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent, source)
        {

        }

        public DateTime ClickTime { get; set; }

    }

    public class TimeButton : Button
    {
        public static readonly RoutedEvent ReportTimeEvent = EventManager.RegisterRoutedEvent("ReportTime", RoutingStrategy.Bubble, typeof(EventHandler<ReportTimeEventArgs>), typeof(TimeButton));

        public event RoutedEventHandler ReportTime
        {
            add { this.AddHandler(ReportTimeEvent, value); }
            remove { this.RemoveHandler(ReportTimeEvent, value); }
        }

        protected override void OnClick()
        {
            base.OnClick();
            ReportTimeEventArgs args = new ReportTimeEventArgs(ReportTimeEvent, this);
            args.ClickTime = DateTime.Now;
            this.RaiseEvent(args);
        }

    }

    public class Student
    {
        public static readonly RoutedEvent NameChangedEvent = EventManager.
            RegisterRoutedEvent("NameChanged",
            RoutingStrategy.Bubble,
            typeof(RoutedEventHandler),
            typeof(Student));

        public int Id { get; set; }

        public string Name { get; set; }


    }

}
